/*
api封装
1：src/utiles/request.js
2:安装与导入axios
3:创建axios副本，副 本中配制基地址
4：创建副本的请求拦截与响应拦截
5：暴露副本
6：src/api/模块名.js
7:导入axios副本
8：定义api方法
9：导入方法使用
*/
import { Toast } from 'vant'
import axios from 'axios'
import store from '@/store'
const request = axios.create({
  baseURL: 'http://toutiao.itheima.net/'
})
let cancelArr = []
// 请求拦截
request.interceptors.request.use(
  config => {
    // 将token加入请求拦截
    // 实际开发：1：不需要token你加了不受影响 2：不需要token加了直接报错
    if (!config.noToken) {
      config.headers.Authorization = 'Bearer ' + store.state.tokenObj.token
    }
    // 取消上一次接口请求
    // 找出上一次接口请求  url请求地址，请求方式
    cancelArr = cancelArr.filter(item => {
      if (item.url === config.url && item.method === config.method) {
        item.fn()
        return false
      }
      return true
    })
    if (!config.noCancel) {
      config.cancelToken = new axios.CancelToken(cancelFn => {
        cancelArr.push({
          url: config.url,
          method: config.method,
          fn: cancelFn
        })
      })
    }

    return config
  },
  error => {
    return Promise.reject(error)
  }
)
// 响应拦截
request.interceptors.response.use(
  res => {
    return res
  },
  async error => {
    // console.log('响应拦截error', error)
    // 接口请求错误统一错误处理：统一提示一下
    if (error.response && error.response.data) {
      /*
      Toast
      1:导入与注册
      2:vue中使用
         this.$toast.success('信息')
         this.$toast.fail('信息')
         js中：
         import {Toast} from 'vant'
         Toast===this.$toast
         Toast.success('信息')
      */
      // alert(error.response.data.message)

      //  401token失效  删除token并跳转到登陆页
      if (error.response.status === 401) {
        // 抢救一下token(很复杂)
        //    产生了新的token：通过refresh_token调用接口产生一个新的token,不希望进入当前定义的请求拦截与响应拦截
        //        存储token
        //        正常进行前面的接口请求
        //    refresh_token也失效了：
        //        删除token,refresh_token也删除跳转登录页
        try {
          const res = await axios({
            url: 'http://toutiao.itheima.net/v1_0/authorizations',
            method: 'put',
            headers: {
              Authorization: 'Bearer ' + store.state.tokenObj.refresh_token
            }
          })
          // console.log('成功refresh_token', res)
          //  存储token
          store.commit('setTokenObj', {
            token: res.data.data.token,
            refresh_token: store.state.tokenObj.refresh_token
          })
          //  正常进行前面的接口请求
          return request(error.config)
        } catch {
          // 成功res会有返回值（token）
          Toast.fail(error.response.data.message)
          store.commit('logout')
        }
      } else {
        Toast.fail(error.response.data.message)
      }
    }
    return Promise.reject(error)
  }
)
export default request
